package lk.icta.core.service;

import lk.icta.core.entity.Organization;
import lk.icta.user.entity.User;

import java.util.List;
import java.util.Map;

/**
 * @author Tharanga Punchihewa
 */
public interface OrganisationManagementService {
    /**
     * Adding a Organization
     *
     * @param organization organization to be added
     * @param user         The user requesting to add the organization
     */
    public void addOrganization(Organization organization, User user);


    /**
     * Update a Organization
     *
     * @param organization organization to be updated
     * @param user         The user requesting to update the organization
     */
    public void updateOrganization(Organization organization, User user);

    /**
     * Update a Organization due date
     *
     * @param organization organization to be updated
     * @param user         The user requesting to update the organization
     */
    public void updateDueDate(Organization organization, User user);

    /**
     * get  a Organization by organization id
     *
     * @param id   The id of Organization
     * @param user The user requesting to Organization
     * @return Organization
     */

    public Organization getOrganizationByIdUKey(int id, User user);

    /**
     * get  all organizations
     *
     * @param user The user requesting to Organization List
     * @return Organization
     */
    public List<Organization> getAllOrganizations(User user);

    /**
     * active a  organization
     *
     * @param organization organization to be active
     * @param user         The user requesting to active  Organization
     */
    public void activeOrganization(Organization organization, User user);

    /**
     * inactive a  organization
     *
     * @param organization organization to be inactive
     * @param user         The user requesting to active  Organization
     */
    public void inactiveOrganization(Organization organization, User user);

    /**
     * get  organizations List
     *
     * @param language user preferred language
     * @param user     The user requesting to active  Organization list
     * @return Organization list
     */
    public Map<Integer, String> getOrganizationListByLanguage(String language, User user);

    /**
     * Filter un register   organizations List
     *
     * @param user The user requesting to un register  Organization list
     * @return Organization list
     */
    public List<Organization> getUnRegisterOrganizationList(User user);

    /**
     * Filter Active    organizations List  for edit
     *
     * @param user The user requesting to un register  Organization list
     * @return Organization list
     */
    public List<Organization> getActiveOrganizationList(User user);

    /**
     * Filter register   organizations List
     *
     * @param user The user requesting to un register  Organization list
     * @return Organization list
     */
    public List<Organization> getRegisterOrganizationList(User user);

    /**
     * Filter Active Un register   organizations List
     *
     * @param user The user requesting the operation
     * @return Organization list
     */
    public List<Organization> getActiveUnRegisterOrganizationList(User user);

    /**
     * Filter Active Un register   organizations List
     *
     * @param user The user requesting the operation
     * @return Organization list
     */
    public List<Organization> getActiveRegisterOrganizationList(User user);

    /**
     * Filter un register organization list(init data entry level)
     *
     * @param user The user requesting the operation
     * @return Organization list
     */
    public List<Organization> getInitInfoOrganizationList(User user);
}
